#ifndef SQLBinaryOpExpr_HEADER_H
#define SQLBinaryOpExpr_HEADER_H


#include "../SQLExpr.h"
#include "../SQLExprImpl.h"
// #include "../../visitor/SQLASTVisitor.h"

#include "SQLBinaryOperator.h"
#include "../../../DbType.h"

class SQLBinaryOpExpr : virtual public SQLExprImpl
{

public:
	// static long serialVersionUID = 1L;
	SQLExpr_ptr left;
	SQLExpr_ptr right;
	SQLBinaryOperator_ptr xoperator;
	BOOL_ptr parenthesized;
	SQLObject_list_ptr mergedList;

	static string_ptr class_;
	SQLBinaryOpExpr();
	virtual ~SQLBinaryOpExpr();

	SQLBinaryOpExpr(SQLExpr_ptr left, SQLBinaryOperator_ptr xoperator, SQLExpr_ptr right);
	SQLBinaryOpExpr(SQLExpr_ptr left, SQLBinaryOperator_ptr xoperator, SQLExpr_ptr right, DbType_ptr dbtype);
	SQLBinaryOpExpr(SQLExpr_ptr left, SQLExpr_ptr right, SQLBinaryOperator_ptr xoperator);
  SHAREDOBJECT(SQLBinaryOpExpr);

	SQLExpr_ptr getLeft();

	void setLeft(SQLExpr_ptr left);

	SQLExpr_ptr getRight();

	void setRight(SQLExpr_ptr right);

	SQLBinaryOperator_ptr getOperator();

	void setOperator(SQLBinaryOperator_ptr xoperator);

	int hashCode();
	bool equals(Object_ptr obj);
	static SQLExpr_ptr and_(SQLExpr_ptr a, SQLExpr_ptr b);
	static SQLExpr_ptr or_(SQLExpr_ptr a, SQLExpr_ptr b);

	static SQLExpr_list_ptr split(SQLBinaryOpExpr_ptr x);
	static SQLExpr_list_ptr split(SQLExpr_ptr x, SQLBinaryOperator_ptr op);
	static SQLExpr_list_ptr split(SQLBinaryOpExpr_ptr x, SQLBinaryOperator_ptr op);
	static void split(SQLExpr_list_ptr outList, SQLExpr_ptr expr, SQLBinaryOperator_ptr op);

	BOOL_ptr isParenthesized() { return parenthesized; }

	void setParenthesized(BOOL_ptr parenthesized) { this->parenthesized = parenthesized; }

	static BOOL_ptr isOr(SQLExpr_ptr x);
	bool containsAttribute(string_ptr name){};
	void addBeforeComment(string_list_ptr comments){};
	string_list_ptr getAfterCommentsDirect(){};
	string_list_ptr getBeforeCommentsDirect(){};
	void addAfterComment(string_ptr comment){};
	void addAfterComment(string_list_ptr comments){};
	bool hasBeforeComment(){};
	bool hasAfterComment(){};
	SQLExpr_ptr other(SQLExpr_ptr x);
	static SQLBinaryOpExpr_ptr merge(ParameterizedVisitor_ptr v, SQLBinaryOpExpr_ptr x);
	static BOOL_ptr mergeEqual(SQLExpr_ptr a, SQLExpr_ptr b);
	void addMergedItem(SQLBinaryOpExpr_ptr item);

protected:
	void accept0(SQLASTVisitor_ptr visitor);
};
typedef SQLBinaryOpExpr_ptr SQLBinaryOpExpr_ptr;
#endif
